#include<iostream>
using namespace std;
int dp[21][15001]; //狀態數組dp[i][j]
//放入(掛上)前i個物品(鉤碼)後,達到j狀態的方法數
int main(int i,int j,int k)
{
int n; //掛鉤數
int g; //鉤碼數
int c[21]; //掛鉤位置
int w[21]; //鉤碼重量
/*Input*/
cin>>n>>g;
for(i=1;i<=n;i++)
cin>>c[i];
for(i=1;i<=g;i++)
cin>>w[i];
/*Initial*/
memset(dp,0,sizeof(dp)); //達到每個狀態的方法數初始化爲0
dp[0][7500]=1; //7500爲天枰達到平衡狀態時的平衡度
//放入前0個物品後,天枰達到平衡狀態7500的方法有1個,就是不掛鉤碼
/*DP*/
for(i=1;i<=g;i++)
for(j=0;j<=15000;j++)
if(dp[i-1][j]) //優化,當放入i-1個物品時狀態j已經出現且被統計過方法數,則直接使用統計結果
//否則忽略當前狀態j
for(k=1;k<=n;k++)
dp[i][ j+w[i]*c[k] ] += dp[i-1][j]; //狀態方程
/*Output*/
cout<<dp[g][7500]<<endl;
return 0;
}
解題報告_18.5.25_POJ_1837_0
轉載:https://blog.csdn.net/lyy289065406/article/details/6648094
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.