您的位置:首页 > 其它

01背包能够取到的值>=m的最小值

2015-04-22 12:19 141 查看
问题如下:

   服装店总共有n件衣服,价格分别为P1, P2, …, Pn。店铺开展满500减100活动, 限定顾客每件衣服只能买一件。顾客如何选择衣服搭配最划算(选购衣服价格总和大于500情况下的最小值)。

题意:n件衣服,能够拼出的价值总和>=500 的最小值。

思路:先找到一个可行解cap,把cap 当做背包容量,然后做01背包。

 如果金额为小数,cap扩大100倍就好了。

#define N 1005
#define M 10000

/**服装店总共有n件衣服,价格分别为P1, P2, …, Pn。店铺开展满500减100活动, 限定顾客每件衣服只能买一件。顾客如何选择衣服搭配最划算(选购衣服价格总和大于500情况下的最小值)。
*/
int shop
;
int dp[M]={1,0};
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",shop+i);
int cap=0;
//找一个可行解cap
for(int i=0;i<n&&cap<500;i++)cap+=shop[i];
if(cap<500.0){printf("-1\n");return 0;}
//else 找到了一个可行解cap
for(int i=0;i<n;i++)
for(int v=cap;v>=shop[i];v--)
{
dp[v]+=dp[v-shop[i]];
if(dp[v]>0 && v>=500)cap=v;
}
// 输出最小的能够拼成的金额
printf("%d\n",cap);
return 0;
}
/**
6
100 202 300 405 507 101
ans 501
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐