2018ICPC焦作站網路賽 Transport Ship 多重揹包
阿新 • • 發佈:2018-12-10
這道題乍一看確實像完全揹包,,可是再一想又不會了。。狀態轉移方程怎麼寫QAQ。。果然我還是太菜了55555...後來看了大佬隊友的程式碼,豁然開朗Orz
這道題確實挺考驗對多重揹包的理解和怎麼寫狀態轉移方程的。。(菜雞是這麼認為的,但大佬就說是道裸題QAQ...)
附上正確程式碼:
#include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<iostream> #include<algorithm> using namespace std; #define ll long long const ll MOD=1e9+(ll)7; const int MAX=10001; int dp[MAX]; int n,q; int num[25]; int val[25]; int main() { int t; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&q); memset(num,0,sizeof(num)); memset(val,0,sizeof(val)); memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++) scanf("%d%d",&val[i],&num[i]); dp[0]=1;//注意!! for(int i=1;i<=n;i++)//多重揹包 { int k=1; for(int j=1;j<=num[i];j++) { if(val[i]*k>MAX)//“剪枝” break; int c=val[i]*k; for(int s=MAX;s>=c;s--)//轉化為01揹包 { dp[s]=(dp[s]+dp[s-c])%MOD;//狀態轉移 } k*=2;//二進位制優化 } } int x; while(q--) { scanf("%d",&x); printf("%d\n",dp[x]%MOD); } } return 0; }