Dima and Salad 題解 01揹包變形

2022-06-10 16:27:13 字數 826 閱讀 5240

給你n個物品,每個物品有兩個值乙個為a,乙個為b

要你拿任意的物品使得\(\sum a/ \sum b=k ,且max(\sum a)\)

\(1<=n<=100\; 1<=k=10\; 1<=a[i],b[i]<=100\)

乙個顯然易見的思路設\(dp[i][j]\)為是否有\(\sum a=i\; \sum b=j\)

然後最後複雜度為\(o(1e10)\) 顯然不行

所以考慮化簡

把這個問題轉化為每個物品重量為\(a[i]-k*b[i]\) 價值為\(a[i]\)

轉化為變為01揹包

然後由於有負數,所以把揹包的初始體積平移一下即可

#include#define fi first

#define se second

#define debug cout<<"i am here"const int maxn=2e5+5,inf=0x3f3f3f3f,mod=1e9+7;

const int eps=1e-3;

int n,k;

int a[110],b[110];

int dp[110][maxn];

signed main()

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

int mid=1e5;

for(int i=0;i<=n;i++)

}dp[0][mid]=0;

for(int i=1;i<=n;i++)}}

printf("%d\n",dp[n][mid]<=0?-1:dp[n][mid]);

return 0;

}

4數之和為0(題解)

題意 zjm 有四個數列 a,b,c,d,每個數列都有 n 個數字。zjm 從每個數列中各取出乙個數,他想知道有多少種方案使得 4 個數的和為 0。當乙個數列中有多個相同的數字的時候,把它們當做不同的數對待。思路 1.暴力列舉o n 4 2.兩兩枚舉o n 2 利用桶排 3.兩兩分組,一組求和排序 ...

XJOI 3416 階乘末尾0 題解

尋找乙個最小的n,使得n 末尾恰好有q個0 輸入乙個整數q 如果有解輸出乙個整數n 否則輸出 impossible impossible 1 q 10 18 此題仔細觀察,發現其實可以二分n,反過來驗證q,就可以了。judge函式是算x!末尾有幾個0的,就是算因數5的個數,可以仔細體會一下。incl...

vivado localhost(0)問題解決彙總

記錄乙個除錯pynq出現的問題 第一次出現localhost 0 時 是沒有將板子上跳線帽選擇到正確的位置 jtag 第二次出現時 自己的usb連線線是 青春版 的 建議買usb線一定不要貪便宜,否則只能輸電 第三次出現時 這個問題比較奇怪,pynq上搭載了乙個外設 偵錯程式 問題出現是這樣的 我將...