分组背包
刚开始看分组背包的题目,想了一下,觉得好难啊,跟前面一点都联系不上啊,怎么办怎么办
但其实啊
跟01背包有异曲同工之处的,我觉得是01背包和多重背包的结合体???
一直在纠结一个组里面选一个其他都不能再选了,巴拉巴拉...
这...不就是01背包的思想吗?
就是一个组,s个物品,只可能会有s+1种决策,这种决策是相互独立的啊,要么选第0个,要么选第1个,巴拉巴拉...
数据范围也不大,可以直接开三重循环,一重枚举组数,一重枚举j背包容量,一种枚举决策。
从大到小哦,别忘了
哇靠,手敲了一边代码,真的觉得分组背包是最简单的背包,希望不要打脸哦
刚开始我写的时候状态转移方程错了,还在想判断条件为什么要j>=v[k],哈哈哈哈,原来状态转移方程错了呀
这个k是第几个决策的意思,第k个,所以状态转移方程是f[j]=max(f[j],f[j-v[k]]+w[k])
哈哈哈哈,被自己蠢到了,hhh
#includeusing namespace std; const int N=110; int v[N],w[N],f[N]; int main(){ int n,m; cin>>n>>m; for(int i=0;i ) { int s; cin>>s; for(int j=0;j >v[j]>>w[j]; for(int j=m;j>=0;j--) { for(int k=0;k) { if(j>=v[k]) f[j]=max(f[j],f[j-v[k]]+w[k]); } } } cout<endl; return 0; }