背包问题

来源:互联网 发布:金税盘开票软件官网 编辑:程序博客网 时间:2024/06/05 18:17

1 01背包

http://acm.hdu.edu.cn/showproblem.php?pid=2602(骨头)

http://www.cnblogs.com/javawebsoa/archive/2013/07/19/3201314.html

http://blog.csdn.net/libin56842/article/details/9338841

01背包的特点就是:每种物品仅有一件,可以选择放或不放。

#include <iostream>#include <algorithm>using namespace std;int a[1005],b[1005];int f[1005][1005];int main(){    int t,n,v;    while(scanf("%d",&t)!=EOF)    {        while(t--)        {            cin>>n>>v;            int i,j;            for(i=1;i<=n;i++)                cin>>a[i];            for(i=1;i<=n;i++)                cin>>b[i];            for(i=1;i<=n;i++)//从第一个骨头呆最后一个骨头            {                for(j=0;j<=v;j++)//容器容量从0到v                {                    if(j>=b[i])//如果第i个骨头可以放入剩余容量的容器中                    f[i][j]=max(f[i-1][j],f[i-1][j-b[i]]+a[i]);//选择放第i个还是不放                    else//如果放不了则只要前i-1个的最大价值                        f[i][j]=f[i-1][j];                }            }            cout<<f[n][v]<<endl;                    }    }}
#include <iostream>#include <algorithm>using namespace std;int a[1005],b[1005];int main(){    int t;    int dp[1005];    while(scanf("%d",&t)!=EOF)    {        while(t--)        {            int n,v,i,j;            cin>>n>>v;            for(i=1;i<=n;i++)                cin>>a[i];            for(i=1;i<=n;i++)                cin>>b[i];            memset(dp,0,sizeof(dp));//注意及时清0            for(i=1;i<=n;i++)            {                for(j=v;j>=b[i];j--)                {                    dp[j]=max(dp[j],dp[j-b[i]]+a[i]);                }            }            cout<<dp[v]<<endl;        }    }}

http://acm.hdu.edu.cn/showproblem.php?pid=2546(饭卡余额)

#include <iostream>#include <algorithm>using namespace std;int cmp(int a,int b){    return a<b;}int main(){    int n;    while(scanf("%d",&n)!=EOF)    {        if(n==0)            break;        int m,i,j;        int b[1005]={0};        int dp[1005]={0};        for(i=1;i<=n;i++)            cin>>b[i];        sort(b+1,b+1+n,cmp);//从下到大排序        int MAX=b[n];//max等于最大的一个        cin>>m;        if(m>=5)        {            m=m-5;//花5元卖最贵的菜            for(i=1;i<n;i++)//注意这里不等于n这里的n是最贵的菜,m-5就已经买过一次了            {                for(j=m;j>=b[i];j--)                {                    dp[j]=max(dp[j],dp[j-b[i]]+b[i]);                }            }            cout<<m+5-MAX-dp[m]<<endl;        }        else            cout<<m<<endl;            }}



0 0