P2347 砝碼稱重 (01背包)


題目描述

設有 1g1g1g 、 2g2g2g 、 3g3g3g 、 5g5g5g 、 10g10g10g 、 20g20g20g 的砝碼各若干枚(其總重 ≤1000 \le 10001000 ),

輸入輸出格式

輸入格式:

 

輸入方式: a1,a2,a3,a4,a5,a6a_1 , a_2 ,a_3 , a_4 , a_5 ,a_6a1,a2,a3,a4,a5,a6

(表示 1g1g1g 砝碼有 a1a_1a1 個, 2g2g2g 砝碼有 a2a_2a2 個,…, 20g20g20g 砝碼有 a6a_6a6 個)

 

輸出格式:

 

輸出方式: Total=NTotal=NTotal=N

NNN 表示用這些砝碼能稱出的不同重量的個數,但不包括一個砝碼也不用的情況)

 

輸入輸出樣例

輸入樣例#1: 復制
1 1 0 0 0 0
輸出樣例Total=3

其實題目中有 “其總重 ≤1000”,這句提示了怎樣做的。

題目是,有n個m克的砝碼問可以稱量多少個重量。其實就是一個方案背包。我們利用了,當背包中有方案數時,就可以說明這些砝碼可以表示這個重量,
而方案數不是我們關心的。那么,當有方案數時,就ans++.
當,將n個m克砝碼看做,n個重量為m的物品,這樣不就轉化為01方案背包了嘛。背包總量為所有和sum。

ac代碼如下:
#include<cstdio>
#define MAXN int(1e6+10)
int dp[MAXN];
int w[MAXN];
int a[] = { 0,1,2,3,5,10,20 };
int main()
{
    int n = 0, k;
    for (int i = 1; i <= 6;++i)
    {
        scanf("%d", &k);
        for (int j = 1; j <= k; ++j)
            w[++n] = a[i];
    }
    int v = 0;
    for (int i = 1; i <= n; ++i)
        v += w[i];
    dp[0] = 1;
    for (int i = 1; i <= n;++i)
    for (int j = v; j >= w[i]; --j)
        dp[j] += dp[j - w[i]];
    int ans = 0;
    for (int i = 1; i <= v;++i)
    if (dp[i])++ans;
    printf("Total=%d\n", ans);
}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM