完全背包问题
dp[j]=min(dp[j-w[i]]+p[i],dp[j]);
dp[j-w[i]]+p[i]表示放进重量为w[i],价值为p[i]的物品,dp[j]表示不放此物品。
#include <iostream>
#include <cstdio>
#define INF 0x6fffffff
#define min(a,b) a<b?a:b;
using namespace std;
int dp[10005];
int main()
{
int empty,fill,maxw;
int n,i,j;
int t;
scanf("%d",&t);
while(t--)
{
int p[1005],w[1005];
scanf("%d%d",&empty,&fill);
maxw=fill-empty;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d%d",&p[i],&w[i]);
}
for(i=0;i<=maxw;i++)
{
dp[i]=INF;
}
dp[0]=0;
for(i=0;i<n;i++)
{
for(j=w[i];j<=maxw;j++)
{
dp[j]=min(dp[j-w[i]]+p[i],dp[j]);
// cout<<dp[j]<<' ';
}
// cout<<endl;
}
if(dp[maxw]<INF)
printf("The minimum amount of money in the piggy-bank is %d.\n",dp[maxw]);
else printf("This is impossible.\n");
}
return 0;
}
本文介绍了一个使用动态规划解决完全背包问题的C++实现案例。通过一个具体的程序示例,详细解释了如何计算在给定容量限制下达到目标值所需的最小代价。文章包括完整的代码解析及注释,适合初学者理解完全背包问题及其算法实现。
5万+

被折叠的 条评论
为什么被折叠?



