poj1384,hdu1114—我的第一篇完全背包

来源:互联网 发布:js date 初始化 编辑:程序博客网 时间:2024/04/30 02:48

这一题的完全背包比较基础,是基础好题,涉及到几个问题:

一:如何处理背包恰好装满;

二:求最小的装满背包的价值;

解决办法是将f[ 0 ]置为0,其他置为INF,(要为求最大的装满背包的价值则置为-INF);注意v要从c[ i ]处开始;

#include<cstdio>#include<cstring>#include<iostream>using namespace std;const int maxn= 10050;const int Maxn= 10050;const int INF=0x3f3f3f3f;int f[maxn];int c[Maxn],w[Maxn];int main(){    int T;    scanf("%d",&T);    while(T--){        int m,n,num;        scanf("%d%d",&n,&m);        m=m-n;        scanf("%d",&num);        for(int i=0;i<num;i++){            scanf("%d%d",&w[i],&c[i]);        }        memset(f,INF,sizeof(f));   //满足恰好装满的条件;        f[0]=0;                     //满足恰好装满的条件;        for(int i=0;i<num;i++){            for(int v=c[i];v<=m;v++){      //一定要从c[i]开始!;                f[v]=min(f[v],f[v-c[i]]+w[i]);            }        }       // for(int i=0;i<=m;i++)printf("%d :%d\n",i,f[i]);        if(f[m]!=INF)printf("The minimum amount of money in the piggy-bank is %d.\n",f[m]);        else printf("This is impossible.\n");    }    return 0;}


0 0
原创粉丝点击