刷题记录——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;
}
发布了21 篇原创文章 · 获赞 8 · 访问量 725

猜你喜欢

转载自blog.csdn.net/qq_17853613/article/details/81301986