第一次尝试多重背包,只想出来把多重背包中的有限次转化为01背包里的每一次来解决一个变形的01背包问题。
代码:
#include <iostream>//多重背包
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define int long long
int w[105],v[105],k[105],dp[105]; int t,m,n;
void dp_(){
for(int i=1;i<=m;i++){
for(int j=1;j<=k[i];j++){//将每样大米的袋数变成次数
for(int k=n;k>=v[i];k--){//01背包问题处理
dp[k]=max(dp[k],dp[k-v[i]]+w[i]);
}
}
}
}
signed main(){
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
cin>>t;
while(t--){
memset(dp,0,sizeof(dp));
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>v[i]>>w[i]>>k[i];
}
dp_();
cout<<dp[n]<<endl;
}
return 0;
}
听说还有更np的办法,以后遇见再说。