洛谷P2347 砝碼稱重

2022-09-04 03:54:12 字數 1371 閱讀 9529

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

輸入格式:

輸入方式: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表示用這些砝碼能稱出的不同重量的個數,但不包括乙個砝碼也不用的情況)

這道題類似於「小a點菜」那道題,都是01揹包求方案數

都是先將f[0]=1,然後f[j]+=f[j-c[i]]計算

即那麼如果選擇了呢,f[i][j]=f[i-c[i]];

為了減少空間浪費,去掉第一維,可以得到:最後再掃一遍記錄個數

#include#include

#include

#include

#include

using

namespace

std;

#define maxn 100010

#define clear(a) memset(a,0,sizeof a)

#define ll long long

#define il inlineil

void read(int &x)

while(ch>='

0'&&ch<='

9')x *=f;

}int

tot, sum, ans;

int pre[7] = ;

int a[10

], f[maxn], val[maxn];

intmain()

f[0] = 1

;

for (int i = 1; i <= 6;i++)

for (int j = 1;j<=a[i];j++)

val[++tot] =pre[i];

for (int i = 1; i <= tot;i++)

for (int j = sum; j >= val[i];j--)

f[j] += f[j -val[i]];

for (int i = 1; i <= sum;i++)

if(f[i])

ans++;//

如果某一位為true說明可能出現這種情況

cout << "

total=

"

}

洛谷 P2347 砝碼稱重

時間限制1.00s 記憶體限制125.00mb 設有1g 2g 3g 5g 10g 20g的砝碼各若干枚 其總重 1000 輸入 1 1 1 0 0 0 0 輸出 1 total 3 方法一 sign j a i 1 思想類似於裝箱問題 include using namespace std con...

P2347 砝碼稱重

題目入口 p2347 砝碼稱重 寫在前面 本題是乙個簡單的 多重揹包 不用二進位制優化也毫無關係 甚至據說六個迴圈都能過 逃 如何記錄方案數 if dp i i ret 解釋來說就是dp當前重量有 最優 方案說明此重量可實現,那麼結果加一 使用模版 模版 揹包問題彙總 多重揹包模版 二進位制優化 i...

P2347 砝碼稱重

題目描述 設有1g 2g 3g 5g 10g 20g的砝碼各若干枚 其總重 1000 輸入格式 輸入方式 a1,a2,a3,a4,a5,a6 表示1g砝碼有a1個,2g砝碼有a2個,20g砝碼有a6個 輸出格式 輸出方式 total n n表示用這些砝碼能稱出的不同重量的個數,但不包括乙個砝碼也不用...