看到7000+的数据,5个物品,直接就裸写了个01背包,然后T了,心里暗暗不爽,才7000就要2进制优化?好嘛,优化一个,这下子总行了吧,交,T了...然后...思密达了,没见过这样的01背包,大爷我都优化完了你还不给面子?后来心生一计,反正最多7499种询问,那我先搞一次,然后你随便问好了,这样优化完之后过了。。这种多个询问的题还是多长个心眼好。
另外这种使用1维数组来DP的方法用还是第一次用,因为用多维数组还得在DP之前把以前的状态搬过来,太麻烦了。
#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;
int dp[10000];
int coins[6]={1,5,10,25,50};
vector<int> money;
int main()
{
int m;
money.clear();
for(int i=0;i<5;i++)
{
for(int j=1;j*coins[i]<=8000;j*=2)
{
money.push_back(j*coins[i]);
}
}
memset(dp,0,sizeof(dp));
dp[0]=1;
for(int i=0;i<money.size();i++)
{
for(int j=7489;j>=0;j--)
{
if(dp[j]&&j+money[i]<=7489)
{
dp[j+money[i]]+=dp[j];
}
}
}
while(scanf("%d",&m)!=EOF)
{
printf("%d\n",dp[m]);
}
return 0;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。