hdu 1114需要装满的完全背包 重点是背包初始化的问题

。,。 最近在看背包九讲 所以就刷了一下背包的题目 这道题目是一个典型的完全背包问题 而且要求满包

在这里 我就简单整理一下背包初始化问题吧  

对于没有要求满包的问题 也就是背包可以不取满的问题 在背包初始化的时候 可以全部初始化为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.\n");
        else printf("The minimum amount of money in the piggy-bank is %d.\n",ans);
    }
    return 0;
}
posted @ 2016-08-11 15:59  猪突猛进!!!  阅读(197)  评论(0编辑  收藏  举报