转化为01背包的做法,在01背包的基础上加上一个for循环表示第i个物品装0->c[i]个即可
参考代码:
#include<iostream> using namespace std; const int M = 10000; int n, m; int dp[M], w[M], v[M], c[M]; int main(){ cin>>n>>m; for(int i = 0; i < n; i++){ cin>>w[i]>>v[i]>>c[i]; } for(int i = 0; i < n; i++){ for(int j = m; j >= 0; j--){ for(int k = 0; k <= c[i]; k++){ if(j >= w[i] * k){ dp[j] = max(dp[j], dp[j - k * w[i]] + k * v[i]); } } } } cout<<dp[m]; return 0; }
0.0分
2 人评分