刷題記錄——7月31——動態規劃

悼念512汶川大地震遇難同胞――珍惜現在,感恩生活(hdu2191)

完全揹包,用f[i]表示花費i費用時,能獲得的最多糧食數目,f[i]=max(f[i],f[i-p[i]]+w[i]);

對於有k件的商品,我們吧一個商品看作k件完全相同的k件商品即可。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
int n,t,m;
int p[200],w[200],num[200],dp[200];
//p是價格 w是重量 num是一共有這種大米一共有num袋
int main(){
	cin>>t;
	while(t--){//每袋大米的價格重量袋數 
		scanf("%d%d",&m,&n);
		memset(dp,0,sizeof(dp));
		for(int i=1;i<=n;i++){
			scanf("%d%d%d",&p[i],&w[i],&num[i]);
		}
		for(int i=1;i<=n;i++){
			for(int k=1;k<=num[i];k++){
				 for(int j=m;j>=p[i];j--){ 
                    dp[j]=max(dp[j],dp[j-p[i]]+w[i]);
                } 
            }
		}
		cout<<dp[m]<<endl;
	}
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章