1 solutions
-
0
C++ :
#include <bits/stdc++.h> using namespace std; int n,m; //体积恰好是j的情况,表示体积要用完 int f[1010];//记录体积恰好是j的情况下的最大价值 int g[1010];//记录体积恰好是j的情况下的方案数 int mod = 1000000000 + 7; int INF = 1000000; int v,w; int t,s; int main(){ cin>>n>>m; //背包什么都不装也是一种方案 for(int i = 0;i <= m;i++) g[i] = 1; //循环物品数 for(int i = 1;i <= n;i++){ cin>>v>>w; //01背包循环背包容量~当前物品的体积 for(int j = m;j >= v;j--){ t = max(f[j],f[j-v]+w);//选和不选的最大价值 //判断从哪个决策转移过来的 s = 0; //两个决策如果都是最优的,那么方案是就是两者之和 if(t == f[j]) s = (s+g[j])%mod;//没选是最优的 if(t == f[j-v] + w) s = (s+g[j-v])%mod;//选了是最优的 f[j] = t; g[j] = s; } } cout<<g[m]; return 0; }
- 1
Information
- ID
- 9953
- Time
- 1000ms
- Memory
- 128MiB
- Difficulty
- (None)
- Tags
- # Submissions
- 0
- Accepted
- 0
- Uploaded By