3 条题解
-
0
由于每种物体可以采购多个(相当于无限个),所以这题就是一个完全背包模板。
#include<bits/stdc++.h> using namespace std; long long n,m,i,j,a[305],b[305],dp[10005]; int main(){ cin>>n>>m; for(i=1;i<=n;i++) cin>>a[i]>>b[i]; for(i=1;i<=n;i++) for(j=b[i];j<=m;j++) dp[j]=max(dp[j],dp[j-b[i]]+a[i]); cout<<dp[m]; return 0; }
-
0
dp
#include<bits/stdc++.h> using namespace std; int t,n,i,j,a[3005],b[3005],f[10005]; int read() { int x=0,m=1; char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-')m=-1; ch=getchar(); } while(ch>='0'&&ch<='9') { x=x*10+ch-48; ch=getchar(); } return x*m; } void write(int x) { if(x<0){ putchar('-'); write(-x); return; } if(x>=10)write(x/10); putchar(x%10+'0'); } int main() { n=read();t=read(); for(i=1;i<=n;i++)b[i]=read(),a[i]=read(); for(i=1;i<=n;i++) { for(j=a[i];j<=t;j++) f[j]=max(f[j],f[j-a[i]]+b[i]); } write(f[t]); return 0; }
-
0
用动态规划的dp数组,max(dp[j],dp[j-v[i]]+w[i])的这一个最大值,就为dp[j]的值。 #include<bits/stdc++.h> using namespace std; unsigned long long n,k,v[10001],w[10001],dp[1000001]; int main() { cin>>n>>k; for(int i=1;i<=n;i++)cin>>w[i]>>v[i]; for(int i=1;i<=n;i++) for(int j=v[i];j<=k;j++) dp[j]=max(dp[j],dp[j-v[i]]+w[i]); cout<<dp[k]; return 0; }
- 1
信息
- ID
- 52
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 2
- 标签
- (无)
- 递交数
- 63
- 已通过
- 39
- 上传者