【USACO 3.1】Stamps (完全背包)
题意:给你n种价值不同的邮票,最大的不超过10000元,一次最多贴k张,求1到多少都能被表示出来?n≤50,k≤200。
题解:dp[i]表示i元最少可以用几张邮票表示,那么对于价值a的邮票,可以推出dp[j]=min(dp[j],dp[j-a]+1)。j从a到k*10000顺序枚举,因为类似于完全背包。
http://train.usaco.org/usacoprob2?a=fSgPyIazooa&S=stamps
/* TASK:stamps LANG:C++ */ #include<cstdio> #include<algorithm> #include<cstring> #define INF 0x3f3f3f3f using namespace std; int n,k; int dp[2000005]; int main(){ freopen("stamps.in","r",stdin); freopen("stamps.out","w",stdout); memset(dp,INF,sizeof dp); dp[0]=0; scanf("%d%d",&k,&n); int a; for(int i=1;i<=n;i++){ scanf("%d",&a); for(int j=a;j<=k*10000;j++) dp[j]=min(dp[j],dp[j-a]+1); } for(int i=1;;i++) if(dp[i]>k){ printf("%d\n",i-1); break; } /* Test 1: TEST OK [0.011 secs, 11992 KB] Test 2: TEST OK [0.011 secs, 11992 KB] Test 3: TEST OK [0.011 secs, 11992 KB] Test 4: TEST OK [0.011 secs, 11992 KB] Test 5: TEST OK [0.011 secs, 11992 KB] Test 6: TEST OK [0.011 secs, 11992 KB] Test 7: TEST OK [0.000 secs, 11992 KB] Test 8: TEST OK [0.011 secs, 11992 KB] Test 9: TEST OK [0.011 secs, 11992 KB] Test 10: TEST OK [0.076 secs, 11992 KB] Test 11: TEST OK [0.216 secs, 11992 KB] Test 12: TEST OK [0.076 secs, 11992 KB] Test 13: TEST OK [0.119 secs, 11992 KB] */ return 0; }
┆凉┆暖┆降┆等┆幸┆我┆我┆里┆将┆ ┆可┆有┆谦┆戮┆那┆ ┆大┆始┆ ┆然┆
┆薄┆一┆临┆你┆的┆还┆没┆ ┆来┆ ┆是┆来┆逊┆没┆些┆ ┆雁┆终┆ ┆而┆
┆ ┆暖┆ ┆如┆地┆站┆有┆ ┆也┆ ┆我┆ ┆的┆有┆精┆ ┆也┆没┆ ┆你┆
┆ ┆这┆ ┆试┆方┆在┆逃┆ ┆会┆ ┆在┆ ┆清┆来┆准┆ ┆没┆有┆ ┆没┆
┆ ┆生┆ ┆探┆ ┆最┆避┆ ┆在┆ ┆这┆ ┆晨┆ ┆的┆ ┆有┆来┆ ┆有┆
┆ ┆之┆ ┆般┆ ┆不┆ ┆ ┆这┆ ┆里┆ ┆没┆ ┆杀┆ ┆来┆ ┆ ┆来┆