完全背包即物品的数量不收限制,
根据01背包的思想,因为每件物品只能选1个,则要求我们不能依赖已选择物品i的选项的时候,所以需要逆序遍历
则在完全背包问题中,我们需要正序遍历。
此题时要求求出最小价值。
代码如下:
#include <stdio.h> #include <algorithm> using namespace std; #define inf 10000000 #define min(a,b) a<b?a:b int dp[11000]; int p[600]; int w[600]; int main() { int i,j,k,n,e,f; scanf("%d",&k); while(k--) { scanf("%d",&e); scanf("%d",&f); int diff = f - e; scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%d",&p[i]); scanf("%d",&w[i]); } //memset(dp,inf,sizeof(dp));//不可以这样初始化 for(int i=0;i<=diff;i++) { dp[i]=inf; } dp[0] = 0; for(i=1;i<=n;i++) { for(j=w[i];j<=diff;j++) { dp[j] = min(dp[j],dp[j-w[i]]+p[i]); } } if(dp[diff] == inf){printf("This is impossible.\n");} else { printf("The minimum amount of money in the piggy-bank is %d.\n",dp[diff]); } } system("pause"); return 0; }