給你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上搭載了乙個外設 偵錯程式 問題出現是這樣的 我將...