洛谷 P2347 砝码称重 != codevs 2144

题目描述

设有1g、2g、3g、5g、10g、20g的砝码各若干枚(其总重<=1000),

输入输出格式

输入格式:

 

输入方式:a1 a2 a3 a4 a5 a6

(表示1g砝码有a1个,2g砝码有a2个,…,20g砝码有a6个)

 

输出格式:

 

输出方式:Total=N

(N表示用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况)

 

输入输出样例

输入样例#1:
1 1 0 0 0 0
输出样例#1:
Total=3

砝码只有选与不选 所以是01背包
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;

bool fw[10001];
int h=0,a1,a2,a3,a4,a5,a6;
int a[10001],ans,i,j,dp[10001];
int main()
{
    cin>>a1>>a2>>a3>>a4>>a5>>a6;
    while(a1--)
    a[h++]=1;
    while(a2--)
    a[h++]=2;
    while(a3--)
    a[h++]=3;
    while(a4--)
    a[h++]=5;
    while(a5--)
    a[h++]=10;
    while(a6--)
    a[h++]=20;
    for(i=0;i<h;++i)
    {
        for(j=1000;j>=a[i];--j)//题目说总重不超过1000
        dp[j]=max(dp[j],dp[j-a[i]]+a[i]);
    }
    for(i=1;i<=1000;++i)//累加不同情况
    if(dp[i]&&!fw[dp[i]])
    {
        fw[dp[i]]=1;
        ans++;
    }
    cout<<"Total="<<ans;
}

 

posted @ 2017-02-05 14:53  杀猪状元  阅读(182)  评论(0编辑  收藏  举报