poj 1283 DP

分析:典型dp,状态转移方程dp[i][j]=dp[i-1][j-1]+dp[i][j-i];dp[i][j]表示i辆卡车装j台电脑的方法数。
例如:8台电脑3台车
      

  卡车1 卡车2 卡车3 dp[3,8]=dp[2,7]+dp[3,5]
第一类 6 1 1 卡车3只放一台电脑,运法总数相当于
2台卡车运7台电脑dp[2,7]。
5 2 1
4 3 1
第二类 4 2 2 每台车有一台以上电脑,运法总数相当于
3台车运5台电脑dp[3,5]
3 3 2

c++

View Code
#include<stdio.h>
#include<string.h>
__int64 dp[210][210];
void init()
{
int i;
for(i=1;i<=200;i++)
{
dp[i][i]=dp[1][i]=dp[i][0]=dp[0][i]=1;
}
for(i=2;i<=200;i++)
{
for(int j=i+1;j<=200;j++)
{
dp[i][j]=dp[i-1][j-1]+dp[i][j-i];
}
}
}
int main()
{
int n,k,i,j;
init();
while(scanf("%d%d",&n,&k),n||k)
{
printf("%I64d\n",dp[k][n]);
}
return 0;
}

java

View Code
import java.io.*;
import java.util.*;
import java.math.*;
public class Main{
static long dp[][]=new long[210][210];
static void init()
{
int i;
for(i=1;i<=200;i++)
{
dp[i][i]=dp[1][i]=dp[i][0]=dp[0][i]=1;
}
for(i=2;i<=200;i++)
{
for(int j=i+1;j<=200;j++)
{
dp[i][j]=dp[i-1][j-1]+dp[i][j-i];
}
}
}

public static void main(String args[]){
Scanner cin=new Scanner(System.in);
int n,k;
init();
while(cin.hasNext())
{
n=cin.nextInt();
k=cin.nextInt();
if(n==0&&k==0) break;
System.out.println(dp[k][n]);
}
}
}




posted @ 2011-12-19 14:42  Because Of You  Views(472)  Comments(0Edit  收藏  举报