背包问题2--完全背包

01背包即无重复选取,每个物品仅放一次。多完全背包就不一样了。它可以重复选取,由01背包演化而来。

下面仅贴模板代码

/*
完全背包问题的特点是,每种物品可以无限制的重复使用,可以选择放或不放。
完全背包问题描述:
有N物品和一个容量为V的背包。第i件物品的重量是wei[i],价值是val[i]。
*/
 
#include
#include
#include
#include
using namespace std;
const int N=1e5;
const int inf=0x3f3f3f3f;
int v[N],w[N],e,f,n;
int dp[N];
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		scanf("%d%d",&e,&f);
		scanf("%d",&n);
		for(int i=1;i<=n;i++)
		scanf("%d%d",&v[i],&w[i]);
		memset(dp,inf,sizeof(dp));
		dp[e]=0;
		for(int i=1;i<=n;i++)
		for(int k=e+w[i];k<=f;k++)
			dp[k]=min(dp[k],dp[k-w[i]]+v[i]);
			
		if(dp[f]!=inf)
		printf("The minimum amount of money in the piggy-bank is %d.\n",dp[f]);
		else printf("This is impossible.\n");
	}
}
//此代码为HDU1114;

 

你可能感兴趣的:(dp---背包问题)