hdu 1248

http://acm.hdu.edu.cn/showproblem.php?pid=1248

唉。。。这题,我不会完全背包问题,只能暴力了,还好数据比较弱,果断过了,但是用暴力方法过的感觉很不爽啊。

代码如下:

#include"stdio.h"

int main( )
{
    int i,j,k,n,a,b,c,t;
    int max,x,y,z;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        max=0;
        a=n/150;b=n/200;c=n/350;
        for(i=0;i<=c;i++)
        {
            x=350*i;
            for(j=0;j<=b;j++)
            {
                y=200*j;
                if(x+y>n)
                    break;
                for(k=0;k<=a;k++)
                {
                    z=150*k;
                    if(x+y+z>n)
                        break;
                    if(max<x+y+z)
                        max=x+y+z;
                }
            }
        }
        printf("%d\n",n-max);
    }
    return 0;
}
            

以下代码为完全背包代码:

#include <iostream>
using namespace std;


int main()
{
    int coin[3] = {150, 200, 350};
    int t, i, j, n;
    
    int dp[100005];
    cin>>t;
    while(t--)
    {
        cin>>n;
        
        memset(dp,0,sizeof(dp));
        
    
        
        for(i = 0; i < 3; i++)
        {
            for(j = coin[i]; j <= n; j++)
            {
                if(dp[j] < dp[j-coin[i]]+coin[i])   //这块加一个判断、、、
                    dp[j] = dp[j-coin[i]] + coin[i];
            }
        }
        
        cout<<n-dp[n]<<endl;
    }
    
    return 0;
}
原文地址:https://www.cnblogs.com/chaosheng/p/2494355.html