。,。 最近在看背包九讲 所以就刷了一下背包的题目 这道题目是一个典型的完全背包问题 而且要求满包
在这里 我就简单整理一下背包初始化问题吧
对于没有要求满包的问题 也就是背包可以不取满的问题 在背包初始化的时候 可以全部初始化为0(inf)因为不要求其满包 所以 在求解的过程中 就不用强求从第一个点开始取
而对于满包的问题 则必须是从dp[0]这个有效的点开始存放的 其他都必须初始化为无效状态 因为如果需要满包 则必须从0这个状态开始的后续状态才满足条件
。,。 写的有点乱 借鉴一下其他人的。,。
上代码
#include<cstdio> #include<string.h> #include<iostream> #define INF 11111111 using namespace std; int main() { int t,e,f; cin>>t; int w[501],p[501]; int dp[10001]; dp[0]=0; while(t--) { cin>>e>>f; int n,wmax; wmax=f-e; // cout<<wmax<<endl; cin>>n; for(int i=1;i<=n;i++) cin>>p[i]>>w[i]; for(int i=1;i<=wmax;i++) dp[i]=INF; dp[0]=0; for(int i=1;i<=n;i++) { for(int j=w[i];j<=wmax;j++) dp[j]=min(dp[j],dp[j-w[i]]+p[i]); } int ans; if(dp[wmax]>=11111110) ans=0; else ans=dp[wmax]; if(ans==0) printf("This is impossible. "); else printf("The minimum amount of money in the piggy-bank is %d. ",ans); } return 0; }