3 solutions
-
1
#include<bits/stdc++.h> using namespace std; const int N=1010,M=1010; const int P=1e9+7; int f[M],g[M]; //f[j]=t 表示背包体积恰好为j的最大价值是t, //g[j]=k 表示背包体积恰好是j且最大价值恰好是t的方案数为k int v[N],w[N]; int main() { int n,V; cin>>n>>V; memset(f,-0x3f,sizeof f);//状态不合法 f[0]=0;//初始状态 g[0]=1; for(int i=1;i<=n;i++) { cin>>v[i]>>w[i]; } for(int i=1;i<=n;i++) { for(int j=V;j>=v[i];j--) { int t=max(f[j],f[j-v[i]]+w[i]); //得到当前最大值 int cnt=0; //方案总数 if(t==f[j]) cnt+=g[j]; //不选当前物品 if(t==f[j-v[i]]+w[i]) cnt+=g[j-v[i]]; //选择当前物品 f[j]=t; //记录最大值 g[j]=cnt%P; //记录方案 } } int res=0; for(int i=0;i<=V;i++) //枚举所有体积找到最大价值 { res=max(res,f[i]); } int cnt=0; for(int i=0;i<=V;i++) //找到所有等于最大价值的方案 { if(res==f[i]) { cnt=(cnt+g[i])%P; } } cout<<cnt; return 0; }
-
-1
#include<bits/stdc++.h> using namespace std; int n,m,f[10020],v,w,a[10020],res,cnt,k; int main() { cin>>n>>m; a[0]=1; for(int i=1;i<=n;i++) { cin>>v>>w; for(int j=m;j>=v;j--) { if(f[j]<f[j-v]+w) { k=a[j-v]; f[j]=f[j-v]+w; } else if(f[j]==f[j-v]+w) { k=a[j]+a[j-v]; f[j]=f[j]; } else { k=a[j]; f[j]=f[j]; } a[j]=k%1000000007; } } for(int i=1;i<=m;i++) { res=max(res,f[i]); } for(int i=1;i<=m;i++) { if(f[i]==res) { cnt=(cnt+a[i])%1000000007; } } cout<<cnt; return 0; }
-
-1
#include<bits/stdc++.h> using namespace std; int n,m,f[10020],v,w,a[10020],res,cnt,k; int main() { cin>>n>>m; a[0]=1; for(int i=1;i<=n;i++) { cin>>v>>w; for(int j=m;j>=v;j--) { if(f[j]<f[j-v]+w) { k=a[j-v]; f[j]=f[j-v]+w; } else if(f[j]==f[j-v]+w) { k=a[j]+a[j-v]; f[j]=f[j]; } else { k=a[j]; f[j]=f[j]; } a[j]=k%1000000007; } } for(int i=1;i<=m;i++) { res=max(res,f[i]); } for(int i=1;i<=m;i++) { if(f[i]==res) { cnt=(cnt+a[i])%1000000007; } } cout<<cnt; return 0; }
- 1
Information
- ID
- 213
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 5
- Tags
- # Submissions
- 35
- Accepted
- 8
- Uploaded By