- BC20260025's blog
水题合集2
- 2024-3-18 11:57:22 @
A1269 庆功会
# include<iostream>
using namespace std;
const int N=505,M=6005;//奖品种数,拨款金额
int n,m,v,w,s,p;
int dp[M];
int main(){
cin>>n>>m;
for(int i=1;i<=n;++i){
cin>>v>>w>>s;
p=1;
while(s>p){
s-=p;
for(int j=m;j>=v;--j)
dp[j]=max(dp[j],dp[j-v*p]+w*p);
}
for(int j=m;j>=v;--j)
dp[j]=max(dp[j],dp[j-v*s]+w*s);
}
cout<<dp[m];
return 0;
}
A1270 混合背包
# include<iostream>
using namespace std;
const int N=35,M=205;//物品数量,背包容量
int n,m,w,c,p,k;
int dp[M];
int main(){
cin>>m>>n;
for(int i=1;i<=n;++i){
cin>>w>>c>>p;
k=1;
if(p==0)
for(int j=w;j<=m;++j)
dp[j]=max(dp[j],dp[j-w]+c);
else{
while(p>k){
p-=k;
for(int j=m;j>=w;--j)
dp[j]=max(dp[j],dp[j-w*k]+c*k);
}
for(int j=m;j>=w;--j)
dp[j]=max(dp[j],dp[j-w*p]+c*p);
}
}
cout<<dp[m];
return 0;
}
A1271 潜水员
# include<iostream>
using namespace std;
const int M=25,N=85,K=1005;//氧,氮,背包容量
int m,n,k,a,b,c;
int dp[M*K][N*K];
int main(){
cin>>m>>n>>k;
for(int i=1;i<=k;++i){
cin>>a>>b>>c;
for(int j=m*k;j>=a;--j)
for(int l=n*k;k>=b;--l)
dp[j][l]=min(dp[j][l],dp[j-a][j-b]+c);
}
cout<<dp[m];
return 0;
}
#include<cstdio>
#include<cstring>
using namespace std;
int v, u, k;
int a[1001], b[1001], c[1001];
int f[101][101];
int main(){
memset(f,127,sizeof(f));
f[0][0] = 0;
scanf("%d%d%d",&v,&u,&k);
for (int i = 1; i <= k; i++)
scanf("%d%d%d",&a[i],&b[i],&c[i]);
for (int i = 1; i <= k; i++)
for (int j = v; j >= 0; j--)
for (int l = u; l >= 0; l--)
{
int t1 = j+ a[i],t2 = l + b[i];
if (t1 > v) t1 = v; //若氮、氧含量超过需求,可直接用需求量代换,
if (t2> u) t2 = u; //不影响最优解
if (f[t1][t2] > f[j][l] + c[i]) f[t1][t2] = f[j][l] + c[i];
}
printf("%d",f[v][u]);
return 0;
}
A1272 分组背包
# include<iostream>
using namespace std;
const int N=35;
int v,n,t,dp[205];
int w[N],c[N],f,p[12][N],cnt[12];
int main(){
cin>>v>>n>>t;
for(int i=1;i<=n;++i){
cin>>w[i]>>c[i]>>f;
p[f][++cnt[f]]=i;
}
for(int i=1;i<=t;++i)
for(int j=v;j>=0;--j)
for(int k=1;k<=cnt[i];++k){
int l=p[i][k];
if(j>=w[l]) dp[j]=max(dp[j],dp[j-w[l]]+c[l]);
}
cout<<dp[v];
return 0;
}
P1282 多米诺骨牌
# include<iostream>
# include<cstring>
using namespace std;
const int N=1005,mid=5010;
int n,a[N],b[N],s1,s2,t,k,l;
int dp[10100];
int main(){
cin>>n;
memset(dp,0x3f,sizeof(dp));
for(int i=1;i<=n;++i){
cin>>a[i]>>b[i];
s1+=a[i],s2+=b[i];
}
dp[s1-s2+mid]=0;
for(int i=1;i<=n;++i){
t=a[i]-b[i];
if(t<0)
for(int j=5000;j>=2*t-5000;--j){
k=mid+j;
dp[k]=min(dp[k],dp[k+2*t]+1);
}
if(t>0)
for(int j=-5000;j<=5000-2*t;++j){
k=mid+j;
dp[k]=min(dp[k],dp[k+2*t]+1);
}
}
for(int i=0;i<=5000;++i){
k=dp[mid+i],l=dp[mid-i];
if(k>N&&l>N) continue;
else{
cout<<min(k,l);
break;
}
}
return 0;
}
P1284 三角形牧场
# include<iostream>
# include<cmath>
using namespace std;
const int N=45,M=805;
int n,l[N],s;
double p,ans=-1;
bool f[M][M];
int main(){
cin>>n;
for(int i=1;i<=n;++i){
cin>>l[i];
s+=l[i];
}
p=s/2.0;
f[0][0]=1;
for(int i=1;i<=n;++i)
for(int j=p;j>=0;--j)
for(int k=p;k>=0;--k){
if(j>=l[i]) f[j][k]=f[j][k]||f[j-l[i]][k];
if(k>=l[i]) f[j][k]=f[j][k]||f[j][k-l[i]];
}
for(int i=1;i<p;++i)
for(int j=1;j<p;++j){
int k=s-i-j;
if(!f[i][j]) continue;
if(i+j>k&&i+k>j&&j+k>i)
ans=max(ans,(p-i)*(p-j)*(p-k));
}
if(ans==-1) cout<<ans;
else cout<<(int)(sqrt(p*ans)*100);
return 0;
}